//备注：拷贝代码请加上作者信息
//作者：王海涛
//邮箱：1126471088@qq.com
//版本：V1.0.0

#ifndef __PID_FLOAT_H__
#define __PID_FLOAT_H__

#include <stdbool.h>

/* PID控制器结构体 */
typedef struct
{
    float kp;                // 比例系数（动态调整）
    float ki;                // 积分系数（动态调整）
    float kd;                // 微分系数（动态调整）
    
    float Setpoint;          // 设定值
    float Feedback;          // 反馈值
    float Error;             // 当前误差
    float Error_Prev;        // 上一次误差
    float Error_Sum;         // 误差积分累计
    
    float Output_Min;        // 输出最小值
    float Output_Max;        // 输出最大值
    
    bool Integral_Limit_En;  // 积分限幅使能
    float Integral_Min;      // 积分最小值
    float Integral_Max;      // 积分最大值
    
    bool Derivative_Filter_En;  // 微分滤波使能
    float Derivative_Alpha;     // 微分滤波系数（0~1，越大响应越快）
    float Derivative_Filtered;  // 滤波后的微分值

    /********************* 自适应相关参数 *********************/
    bool Adaptive_En;         // 自适应调参使能开关
    float kp_max;             // kp最大值
    float kp_min;             // kp最小值
    float ki_max;             // ki最大值
    float ki_min;             // ki最小值
    float kd_max;             // kd最大值
    float kd_min;             // kd最小值
    // 自适应误差阈值
    float Adaptive_Err_Large; // 误差"大"的阈值（例：0.125）
    float Adaptive_Err_Med;   // 误差"中"的阈值（例：0.0625）
    float Adaptive_Diff_Small;// 误差变化率"小"的阈值（例：0.03125）
}WHT_PID_Float_Ctrl_t;

/* PID处理函数表 */
typedef struct
{
    /**
     * @brief  PID初始化函数
     * @param  pid: PID句柄指针
     * @param  kp: 比例系数
     * @param  ki: 积分系数
     * @param  kd: 微分系数
     * @param  output_min: 输出最小值
     * @param  output_max: 输出最大值
     */
    void (*WHT_Init)(WHT_PID_Float_Ctrl_t *pid, float kp, float ki, float kd, float output_min, float output_max);
    
    /**
     * @brief  重置PID状态（误差、积分、微分等）
     * @param  pid: PID句柄指针
     */
    void (*WHT_Reset)(WHT_PID_Float_Ctrl_t *pid);
    
    /**
     * @brief  配置积分限幅
     * @param  pid: PID句柄指针
     * @param  enable: 使能标志
     * @param  integral_min: 积分最小值
     * @param  integral_max: 积分最大值
     */
    void (*WHT_Config_Integral_Limit)(WHT_PID_Float_Ctrl_t *pid, bool enable, float integral_min, float integral_max);
    
    /**
     * @brief  配置微分滤波（一阶低通滤波）
     * @param  pid: PID句柄指针
     * @param  enable: 使能标志
     * @param  alpha: 滤波系数（建议0.8~0.95）
     */
    void (*WHT_Config_Derivative_Filter)(WHT_PID_Float_Ctrl_t *pid, bool enable, float alpha);
    
    /**
     * @brief  设置PID设定值
     * @param  pid: PID句柄指针
     * @param  setpoint: 设定值
     */
    void (*WHT_Set_Setpoint)(WHT_PID_Float_Ctrl_t *pid, float setpoint);
    
    /**
     * @brief  PID计算核心函数
     * @param  pid: PID句柄指针
     * @param  feedback: 当前反馈值
     * @return float: PID输出值
     */
    float (*WHT_Compute)(WHT_PID_Float_Ctrl_t *pid, float feedback);
    
    /**
     * @brief  配置自适应调参
     * @param  pid: PID句柄指针
     * @param  enable: 自适应使能（true=启用）
     * @param  kp_min/max: kp范围
     * @param  ki_min/max: ki范围
     * @param  kd_min/max: kd范围
     * @param  err_large: 误差"大"阈值（例：0.125）
     * @param  err_med: 误差"中"阈值（例：0.0625）
     * @param  diff_small: 误差变化率"小"阈值（例：0.03125）
     */
    void (*WHT_Config_Adaptive)(WHT_PID_Float_Ctrl_t *pid, bool enable, float kp_min, float kp_max, float ki_min, float ki_max, float kd_min, float kd_max, float err_large, float err_med, float diff_small);
}WHT_PID_Float_t;

/* 全局PID函数表实例 */
extern const WHT_PID_Float_t WHT_PID_Float;

#endif // __PID_FLOAT_H__
